/*
// https://h5.m.jd.com/rn/42yjy8na6pFsq1cx9MJQ5aTgu3kX/index.html

入口：APP首页-领京豆-升级赚京豆
cron:21 9 * * *
21 9 * * * https://raw.githubusercontent.com/smiek2121/scripts/master/gua_MMdou.js, tag=MM领京豆, enabled=true

*/

const $ = new Env('MM领京豆-代理')
require('global-agent/bootstrap')
global.GLOBAL_AGENT.HTTP_PROXY = 'http://150.158.100.141:1222'
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : ''
const notify = $.isNode() ? require('./sendNotify') : ''

const jdVersion = '10.1.2'
const iphoneVersion = [
  Math.ceil(Math.random() * 2 + 12),
  Math.ceil(Math.random() * 4),
]
const UA = `jdapp;iPhone;${jdVersion};${Math.ceil(
  Math.random() * 2 + 12
)}.${Math.ceil(Math.random() * 4)};${randomString(
  40
)};network/wifi;model/iPhone12,1;addressid/0;appBuild/167802;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS ${
  iphoneVersion[0]
}_${
  iphoneVersion[1]
} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1`
const UUID = (UA.split(';') && UA.split(';')[4]) || ''
function randomString(e) {
  e = e || 32
  let t = 'abcdef0123456789',
    a = t.length,
    n = ''
  for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a))
  return n
}

let cookiesArr = []
let message = ''
if ($.isNode()) {
  Object.keys(jdCookieNode).forEach((item) => {
    cookiesArr.push(jdCookieNode[item])
  })
  if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false')
    console.log = () => {}
} else {
  cookiesArr = [
    $.getdata('CookieJD'),
    $.getdata('CookieJD2'),
    ...jsonParse($.getdata('CookiesJD') || '[]').map((item) => item.cookie),
  ].filter((item) => !!item)
}

!(async () => {
  if (!cookiesArr[0]) {
    $.msg(
      '【京东账号一】宠汪汪积分兑换奖品失败',
      '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取',
      'https://bean.m.jd.com/bean/signIndex.action',
      { 'open-url': 'https://bean.m.jd.com/bean/signIndex.action' }
    )
    return
  }
  for (let i = 0; i < cookiesArr.length; i++) {
    if (cookiesArr[i]) {
      $.cookie = cookiesArr[i] + ''
      $.UserName = decodeURIComponent(
        $.cookie.match(/pt_pin=([^; ]+)(?=;?)/) &&
          $.cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]
      )
      $.index = i + 1
      $.bean = 0
      console.log(`\n*****开始【京东账号${$.index}】${$.UserName}****\n`)
      await run()
      if ($.bean > 0) message += `【京东账号${$.index}】获得${$.bean}京豆\n`
    }
  }
  if (message) {
    $.msg($.name, ``, `${message}\n入口：APP首页-领京豆-升级赚京豆`)
    if ($.isNode()) {
      await notify.sendNotify(
        `${$.name}`,
        `${message}\n入口：APP首页-领京豆-升级赚京豆`
      )
    }
  }
})()
  .catch((e) => {
    $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
  })
  .finally(() => {
    $.done()
  })

async function run() {
  try {
    $.taskList = []
    await takePostRequest('beanTaskList')
    await takePostRequest('signBeanAct')
    console.log(`做任务\n`)
    if ($.viewAppHome && $.viewAppHome.takenTask == false) {
      $.IconDoTaskFlag = 0
      console.log(`做任务:${$.viewAppHome.mainTitle};等待完成`)
      await takePostRequest('beanHomeIconDoTask')
      await $.wait(getRndInteger(2500, 3500))
    }
    if ($.viewAppHome && $.viewAppHome.doneTask == false) {
      $.IconDoTaskFlag = 1
      console.log(`做任务:${$.viewAppHome.mainTitle}`)
      await takePostRequest('beanHomeIconDoTask')
      await $.wait(getRndInteger(1000, 1500))
    }
    let s = 0
    do {
      s++
      await task()
      await $.wait(getRndInteger(1000, 1500))
      await takePostRequest('beanTaskList1')
    } while ($.taskFlag && s < 4)

    await $.wait(getRndInteger(1000, 1500))
  } catch (e) {
    console.log(e)
  }
}

async function task() {
  await $.wait(getRndInteger(1000, 1500))
  //做任务
  $.taskFlag = false
  for (let i = 0; i < $.taskList.length; i++) {
    $.oneTask = $.taskList[i]
    if ($.oneTask.status === 1) {
      $.activityInfoList = $.oneTask.subTaskVOS
      for (let j = 0; j < $.activityInfoList.length; j++) {
        $.taskFlag = true
        $.oneActivityInfo = $.activityInfoList[j]
        console.log(
          `做任务:${$.oneActivityInfo.title || $.oneTask.taskName};等待完成`
        )
        $.actionType = 0
        if ($.oneTask.taskType == 9 || $.oneTask.taskType == 8) {
          $.actionType = 1
          await takePostRequest('beanDoTask')
          await $.wait(
            getRndInteger(
              ($.oneTask.waitDuration &&
                $.oneTask.waitDuration * 1000 + 1000) ||
                6500,
              ($.oneTask.waitDuration &&
                $.oneTask.waitDuration * 1000 + 2000) ||
                7000
            )
          )
          $.actionType = 0
        }
        await takePostRequest('beanDoTask')
        await $.wait(getRndInteger(4000, 5500))
      }
    } else if ($.oneTask.status === 2) {
      console.log(`任务:${$.oneTask.taskName};已完成`)
    } else {
      console.log(
        `任务:${$.oneTask.taskName};未能完成\n${JSON.stringify($.oneTask)}`
      )
    }
  }
}

async function takePostRequest(type) {
  let body = ``
  let myRequest = ``
  switch (type) {
    case 'beanTaskList':
    case 'beanTaskList1':
      body = `{"viewChannel":"AppHome"}`
      myRequest = await getGetRequest(`beanTaskList`, escape(body))
      break
    case 'beanHomeIconDoTask':
      body = `{"flag":"${$.IconDoTaskFlag}","viewChannel":"AppHome"}`
      myRequest = await getGetRequest(`beanHomeIconDoTask`, escape(body))
      break
    case 'beanDoTask':
      body = `{"actionType":${$.actionType},"taskToken":"${$.oneActivityInfo.taskToken}"}`
      myRequest = await getGetRequest(`beanDoTask`, escape(body))
      break
    case 'morningGetBean':
      body = `{"fp":"-1","shshshfp":"-1","shshshfpa":"-1","referUrl":"-1","userAgent":"-1","jda":"-1","rnVersion":"3.9"}`
      myRequest = await getGetRequest(`morningGetBean`, escape(body))
      break
    case 'signBeanAct':
      body = `{"fp":"-1","shshshfp":"-1","shshshfpa":"-1","referUrl":"-1","userAgent":"-1","jda":"-1","rnVersion":"3.9"}`
      myRequest = await getGetRequest(`signBeanAct`, escape(body))
      break
    default:
      console.log(`错误${type}`)
  }
  if (myRequest) {
    return new Promise(async (resolve) => {
      $.get(myRequest, (err, resp, data) => {
        try {
          // console.log(data);
          dealReturn(type, data)
        } catch (e) {
          $.logErr(e, resp)
        } finally {
          resolve()
        }
      })
    })
  }
}

async function dealReturn(type, res) {
  try {
    data = JSON.parse(res)
  } catch (e) {
    console.log(`返回异常：${res}`)
    return
  }
  switch (type) {
    case 'beanTaskList':
      if (data.code == 0 && data.data) {
        console.log(
          `当前等级:${data.data.curLevel || 0} 下一级可领取:${
            data.data.nextLevelBeanNum || 0
          }京豆`
        )
        $.taskList = (data.data.taskInfos && data.data.taskInfos) || []
        $.viewAppHome = (data.data.viewAppHome && data.data.viewAppHome) || {}
      } else if (data.data && data.data.bizMsg) {
        console.log(data.data.bizMsg)
      } else {
        console.log(res)
      }
      break
    case 'beanTaskList1':
      if (data.code == 0 && data.data) {
        $.taskList = (data.data.taskInfos && data.data.taskInfos) || []
      } else if (data.data && data.data.bizMsg) {
        console.log(data.data.bizMsg)
      } else {
        console.log(res)
      }
      break
    case 'beanDoTask':
    case 'beanHomeIconDoTask':
      if (data.data && (data.data.bizMsg || data.data.remindMsg)) {
        console.log(data.data.bizMsg || data.data.remindMsg)
        if (data.data.growthResult && data.data.growthResult.sceneLevelConfig) {
          console.log(
            `获得:${data.data.growthResult.sceneLevelConfig.beanNum || 0}京豆`
          )
          $.bean += Number(data.data.growthResult.sceneLevelConfig.beanNum) || 0
          if (!data.data.growthResult.sceneLevelConfig.beanNum) {
            console.log(JSON.stringify(data.data.growthResult.sceneLevelConfig))
          }
        }
      } else {
        console.log(res)
      }
      break
    case 'morningGetBean':
      if (
        data.code == 0 &&
        data.data &&
        data.data.awardResultFlag + '' == '1'
      ) {
        console.log(`获得:${data.data.beanNum || 0}京豆`)
        $.bean += Number(data.data.beanNum) || 0
      } else if (data.data && data.data.bizMsg) {
        console.log(data.data.bizMsg)
      } else {
        console.log(res)
      }
      break
    case 'signBeanAct':
      if (data.code == 0 && data.data) {
        if (data.data?.continuityAward?.beanAward?.beanCount) {
          console.log(
            `${data.data.continuityAward.title || 0}:${
              data.data.continuityAward.beanAward.beanCount || 0
            }京豆`
          )
          $.bean += Number(data.data.continuityAward.beanAward.beanCount) || 0
        } else {
          if (data.data?.dailyAward) {
            console.log(
              data.data.dailyAward.title +
                `获得:${data.data.dailyAward.beanAward.beanCount || 0}京豆`
            )
            $.bean += Number(data.data.dailyAward.beanAward.beanCount) || 0
          } else {
            console.log('DEBUG1:' + JSON.stringify(data))
          }
        }
      } else {
        console.log('DEBUG2:' + JSON.stringify(res))
      }
      break
    default:
      console.log(`未判断的异常${type}`)
  }
}
async function getGetRequest(type, body) {
  let url = `https://api.m.jd.com/client.action?functionId=${type}&body=${body}&appid=ld&client=apple&clientVersion=${jdVersion}&networkType=wifi&osVersion=${iphoneVersion[0]}.${iphoneVersion[1]}&uuid=${UUID}&openudid=${UUID}`
  const method = `GET`
  const headers = {
    Accept: '*/*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-cn',
    Cookie: $.cookie,
    Referer: 'https://h5.m.jd.com/',
    'User-Agent': UA,
  }
  return { url: url, method: method, headers: headers }
}
// 随机数
function getRndInteger(min, max) {
  return Math.floor(Math.random() * (max - min)) + min
}
function jsonParse(str) {
  if (typeof str == 'string') {
    try {
      return JSON.parse(str)
    } catch (e) {
      console.log(e)
      $.msg(
        $.name,
        '',
        '请勿随意在BoxJs输入框修改内容\n建议通过脚本去获取cookie'
      )
      return []
    }
  }
}

function Env(t, e) {
  'undefined' != typeof process &&
    JSON.stringify(process.env).indexOf('GITHUB') > -1 &&
    process.exit(0)
  class s {
    constructor(t) {
      this.env = t
    }
    send(t, e = 'GET') {
      t = 'string' == typeof t ? { url: t } : t
      let s = this.get
      return (
        'POST' === e && (s = this.post),
        new Promise((e, i) => {
          s.call(this, t, (t, s, r) => {
            t ? i(t) : e(s)
          })
        })
      )
    }
    get(t) {
      return this.send.call(this.env, t)
    }
    post(t) {
      return this.send.call(this.env, t, 'POST')
    }
  }
  return new (class {
    constructor(t, e) {
      ;(this.name = t),
        (this.http = new s(this)),
        (this.data = null),
        (this.dataFile = 'box.dat'),
        (this.logs = []),
        (this.isMute = !1),
        (this.isNeedRewrite = !1),
        (this.logSeparator = '\n'),
        (this.startTime = new Date().getTime()),
        Object.assign(this, e),
        this.log('', `\ud83d\udd14${this.name}, \u5f00\u59cb!`)
    }
    isNode() {
      return 'undefined' != typeof module && !!module.exports
    }
    isQuanX() {
      return 'undefined' != typeof $task
    }
    isSurge() {
      return 'undefined' != typeof $httpClient && 'undefined' == typeof $loon
    }
    isLoon() {
      return 'undefined' != typeof $loon
    }
    isShadowrocket() {
      return 'undefined' != typeof $rocket
    }
    toObj(t, e = null) {
      try {
        return JSON.parse(t)
      } catch {
        return e
      }
    }
    toStr(t, e = null) {
      try {
        return JSON.stringify(t)
      } catch {
        return e
      }
    }
    getjson(t, e) {
      let s = e
      const i = this.getdata(t)
      if (i)
        try {
          s = JSON.parse(this.getdata(t))
        } catch {}
      return s
    }
    setjson(t, e) {
      try {
        return this.setdata(JSON.stringify(t), e)
      } catch {
        return !1
      }
    }
    getScript(t) {
      return new Promise((e) => {
        this.get({ url: t }, (t, s, i) => e(i))
      })
    }
    runScript(t, e) {
      return new Promise((s) => {
        let i = this.getdata('@chavy_boxjs_userCfgs.httpapi')
        i = i ? i.replace(/\n/g, '').trim() : i
        let r = this.getdata('@chavy_boxjs_userCfgs.httpapi_timeout')
        ;(r = r ? 1 * r : 20), (r = e && e.timeout ? e.timeout : r)
        const [o, h] = i.split('@'),
          a = {
            url: `http://${h}/v1/scripting/evaluate`,
            body: { script_text: t, mock_type: 'cron', timeout: r },
            headers: { 'X-Key': o, Accept: '*/*' },
          }
        this.post(a, (t, e, i) => s(i))
      }).catch((t) => this.logErr(t))
    }
    loaddata() {
      if (!this.isNode()) return {}
      {
        ;(this.fs = this.fs ? this.fs : require('fs')),
          (this.path = this.path ? this.path : require('path'))
        const t = this.path.resolve(this.dataFile),
          e = this.path.resolve(process.cwd(), this.dataFile),
          s = this.fs.existsSync(t),
          i = !s && this.fs.existsSync(e)
        if (!s && !i) return {}
        {
          const i = s ? t : e
          try {
            return JSON.parse(this.fs.readFileSync(i))
          } catch (t) {
            return {}
          }
        }
      }
    }
    writedata() {
      if (this.isNode()) {
        ;(this.fs = this.fs ? this.fs : require('fs')),
          (this.path = this.path ? this.path : require('path'))
        const t = this.path.resolve(this.dataFile),
          e = this.path.resolve(process.cwd(), this.dataFile),
          s = this.fs.existsSync(t),
          i = !s && this.fs.existsSync(e),
          r = JSON.stringify(this.data)
        s
          ? this.fs.writeFileSync(t, r)
          : i
          ? this.fs.writeFileSync(e, r)
          : this.fs.writeFileSync(t, r)
      }
    }
    lodash_get(t, e, s) {
      const i = e.replace(/\[(\d+)\]/g, '.$1').split('.')
      let r = t
      for (const t of i) if (((r = Object(r)[t]), void 0 === r)) return s
      return r
    }
    lodash_set(t, e, s) {
      return Object(t) !== t
        ? t
        : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []),
          (e
            .slice(0, -1)
            .reduce(
              (t, s, i) =>
                Object(t[s]) === t[s]
                  ? t[s]
                  : (t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}),
              t
            )[e[e.length - 1]] = s),
          t)
    }
    getdata(t) {
      let e = this.getval(t)
      if (/^@/.test(t)) {
        const [, s, i] = /^@(.*?)\.(.*?)$/.exec(t),
          r = s ? this.getval(s) : ''
        if (r)
          try {
            const t = JSON.parse(r)
            e = t ? this.lodash_get(t, i, '') : e
          } catch (t) {
            e = ''
          }
      }
      return e
    }
    setdata(t, e) {
      let s = !1
      if (/^@/.test(e)) {
        const [, i, r] = /^@(.*?)\.(.*?)$/.exec(e),
          o = this.getval(i),
          h = i ? ('null' === o ? null : o || '{}') : '{}'
        try {
          const e = JSON.parse(h)
          this.lodash_set(e, r, t), (s = this.setval(JSON.stringify(e), i))
        } catch (e) {
          const o = {}
          this.lodash_set(o, r, t), (s = this.setval(JSON.stringify(o), i))
        }
      } else s = this.setval(t, e)
      return s
    }
    getval(t) {
      return this.isSurge() || this.isLoon()
        ? $persistentStore.read(t)
        : this.isQuanX()
        ? $prefs.valueForKey(t)
        : this.isNode()
        ? ((this.data = this.loaddata()), this.data[t])
        : (this.data && this.data[t]) || null
    }
    setval(t, e) {
      return this.isSurge() || this.isLoon()
        ? $persistentStore.write(t, e)
        : this.isQuanX()
        ? $prefs.setValueForKey(t, e)
        : this.isNode()
        ? ((this.data = this.loaddata()),
          (this.data[e] = t),
          this.writedata(),
          !0)
        : (this.data && this.data[e]) || null
    }
    initGotEnv(t) {
      ;(this.got = this.got ? this.got : require('got')),
        (this.cktough = this.cktough ? this.cktough : require('tough-cookie')),
        (this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar()),
        t &&
          ((t.headers = t.headers ? t.headers : {}),
          void 0 === t.headers.Cookie &&
            void 0 === t.cookieJar &&
            (t.cookieJar = this.ckjar))
    }
    get(t, e = () => {}) {
      t.headers &&
        (delete t.headers['Content-Type'], delete t.headers['Content-Length']),
        this.isSurge() || this.isLoon()
          ? (this.isSurge() &&
              this.isNeedRewrite &&
              ((t.headers = t.headers || {}),
              Object.assign(t.headers, { 'X-Surge-Skip-Scripting': !1 })),
            $httpClient.get(t, (t, s, i) => {
              !t && s && ((s.body = i), (s.statusCode = s.status)), e(t, s, i)
            }))
          : this.isQuanX()
          ? (this.isNeedRewrite &&
              ((t.opts = t.opts || {}), Object.assign(t.opts, { hints: !1 })),
            $task.fetch(t).then(
              (t) => {
                const { statusCode: s, statusCode: i, headers: r, body: o } = t
                e(null, { status: s, statusCode: i, headers: r, body: o }, o)
              },
              (t) => e(t)
            ))
          : this.isNode() &&
            (this.initGotEnv(t),
            this.got(t)
              .on('redirect', (t, e) => {
                try {
                  if (t.headers['set-cookie']) {
                    const s = t.headers['set-cookie']
                      .map(this.cktough.Cookie.parse)
                      .toString()
                    s && this.ckjar.setCookieSync(s, null),
                      (e.cookieJar = this.ckjar)
                  }
                } catch (t) {
                  this.logErr(t)
                }
              })
              .then(
                (t) => {
                  const {
                    statusCode: s,
                    statusCode: i,
                    headers: r,
                    body: o,
                  } = t
                  e(null, { status: s, statusCode: i, headers: r, body: o }, o)
                },
                (t) => {
                  const { message: s, response: i } = t
                  e(s, i, i && i.body)
                }
              ))
    }
    post(t, e = () => {}) {
      const s = t.method ? t.method.toLocaleLowerCase() : 'post'
      if (
        (t.body &&
          t.headers &&
          !t.headers['Content-Type'] &&
          (t.headers['Content-Type'] = 'application/x-www-form-urlencoded'),
        t.headers && delete t.headers['Content-Length'],
        this.isSurge() || this.isLoon())
      )
        this.isSurge() &&
          this.isNeedRewrite &&
          ((t.headers = t.headers || {}),
          Object.assign(t.headers, { 'X-Surge-Skip-Scripting': !1 })),
          $httpClient[s](t, (t, s, i) => {
            !t && s && ((s.body = i), (s.statusCode = s.status)), e(t, s, i)
          })
      else if (this.isQuanX())
        (t.method = s),
          this.isNeedRewrite &&
            ((t.opts = t.opts || {}), Object.assign(t.opts, { hints: !1 })),
          $task.fetch(t).then(
            (t) => {
              const { statusCode: s, statusCode: i, headers: r, body: o } = t
              e(null, { status: s, statusCode: i, headers: r, body: o }, o)
            },
            (t) => e(t)
          )
      else if (this.isNode()) {
        this.initGotEnv(t)
        const { url: i, ...r } = t
        this.got[s](i, r).then(
          (t) => {
            const { statusCode: s, statusCode: i, headers: r, body: o } = t
            e(null, { status: s, statusCode: i, headers: r, body: o }, o)
          },
          (t) => {
            const { message: s, response: i } = t
            e(s, i, i && i.body)
          }
        )
      }
    }
    put(t, e = () => {}) {
      const s = t.method ? t.method.toLocaleLowerCase() : 'put'
      if (
        (t.body &&
          t.headers &&
          !t.headers['Content-Type'] &&
          (t.headers['Content-Type'] = 'application/x-www-form-urlencoded'),
        t.headers && delete t.headers['Content-Length'],
        this.isSurge() || this.isLoon())
      )
        this.isSurge() &&
          this.isNeedRewrite &&
          ((t.headers = t.headers || {}),
          Object.assign(t.headers, { 'X-Surge-Skip-Scripting': !1 })),
          $httpClient[s](t, (t, s, i) => {
            !t && s && ((s.body = i), (s.statusCode = s.status)), e(t, s, i)
          })
      else if (this.isQuanX())
        (t.method = s),
          this.isNeedRewrite &&
            ((t.opts = t.opts || {}), Object.assign(t.opts, { hints: !1 })),
          $task.fetch(t).then(
            (t) => {
              const { statusCode: s, statusCode: i, headers: r, body: o } = t
              e(null, { status: s, statusCode: i, headers: r, body: o }, o)
            },
            (t) => e(t)
          )
      else if (this.isNode()) {
        this.initGotEnv(t)
        const { url: i, ...r } = t
        this.got[s](i, r).then(
          (t) => {
            const { statusCode: s, statusCode: i, headers: r, body: o } = t
            e(null, { status: s, statusCode: i, headers: r, body: o }, o)
          },
          (t) => {
            const { message: s, response: i } = t
            e(s, i, i && i.body)
          }
        )
      }
    }
    time(t, e = null) {
      const s = e ? new Date(e) : new Date()
      let i = {
        'M+': s.getMonth() + 1,
        'd+': s.getDate(),
        'H+': s.getHours(),
        'm+': s.getMinutes(),
        's+': s.getSeconds(),
        'q+': Math.floor((s.getMonth() + 3) / 3),
        S: s.getMilliseconds(),
      }
      ;/(y+)/.test(t) &&
        (t = t.replace(
          RegExp.$1,
          (s.getFullYear() + '').substr(4 - RegExp.$1.length)
        ))
      for (let e in i)
        new RegExp('(' + e + ')').test(t) &&
          (t = t.replace(
            RegExp.$1,
            1 == RegExp.$1.length
              ? i[e]
              : ('00' + i[e]).substr(('' + i[e]).length)
          ))
      return t
    }
    msg(e = t, s = '', i = '', r) {
      const o = (t) => {
        if (!t) return t
        if ('string' == typeof t)
          return this.isLoon()
            ? t
            : this.isQuanX()
            ? { 'open-url': t }
            : this.isSurge()
            ? { url: t }
            : void 0
        if ('object' == typeof t) {
          if (this.isLoon()) {
            let e = t.openUrl || t.url || t['open-url'],
              s = t.mediaUrl || t['media-url']
            return { openUrl: e, mediaUrl: s }
          }
          if (this.isQuanX()) {
            let e = t['open-url'] || t.url || t.openUrl,
              s = t['media-url'] || t.mediaUrl
            return { 'open-url': e, 'media-url': s }
          }
          if (this.isSurge()) {
            let e = t.url || t.openUrl || t['open-url']
            return { url: e }
          }
        }
      }
      if (
        (this.isMute ||
          (this.isSurge() || this.isLoon()
            ? $notification.post(e, s, i, o(r))
            : this.isQuanX() && $notify(e, s, i, o(r))),
        !this.isMuteLog)
      ) {
        let t = [
          '',
          '==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3==============',
        ]
        t.push(e),
          s && t.push(s),
          i && t.push(i),
          console.log(t.join('\n')),
          (this.logs = this.logs.concat(t))
      }
    }
    log(...t) {
      t.length > 0 && (this.logs = [...this.logs, ...t]),
        console.log(t.join(this.logSeparator))
    }
    logErr(t, e) {
      const s = !this.isSurge() && !this.isQuanX() && !this.isLoon()
      s
        ? this.log('', `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack)
        : this.log('', `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t)
    }
    wait(t) {
      return new Promise((e) => setTimeout(e, t))
    }
    done(t = {}) {
      const e = new Date().getTime(),
        s = (e - this.startTime) / 1e3
      this.log(
        '',
        `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`
      ),
        this.log(),
        (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t)
    }
  })(t, e)
}
